package main

import (
	"fmt"
	"strings"
	"unicode"
)

func main() {
	// Compare 字典比较 a == b，结果将为0，如果 a <b 则返回-1，如果 a> b 则返回+1
	fmt.Println(strings.Compare("a", "b"))
	fmt.Println(strings.Compare("a", "a"))
	fmt.Println(strings.Compare("b", "a"))

	fmt.Println("========================================")
	// 判断 substr 是否包含在 s 之内。
	fmt.Println(strings.Contains("seafood", "foo"))
	fmt.Println(strings.Contains("seafood", "bar"))
	fmt.Println(strings.Contains("seafood", ""))
	fmt.Println(strings.Contains("", ""))

	fmt.Println("========================================")
	// ContainsAny 报告字符中的任何 Unicode 代码点是否在 s 中。
	fmt.Println(strings.ContainsAny("team", "i"))
	fmt.Println(strings.ContainsAny("failure", "u & i"))
	fmt.Println(strings.ContainsAny("foo", ""))
	fmt.Println(strings.ContainsAny("", ""))

	fmt.Println("========================================")

	//Count 计算 s 中不重叠的 substr 实例的数量。如果 substr 是一个空字符串，则 Count 将返回 1 + s 中的 Unicode 代码点数。
	fmt.Println(strings.Count("cheese", "ch"))
	fmt.Println(strings.Count("five", "")) // before & after each rune
	fmt.Println(strings.Count("我的的的的是", "的的"))

	fmt.Println("========================================")
	//EqualFold 报告 s 和 t，解释为 UTF-8 字符串，在 Unicode 大小写折叠下是否相等。
	fmt.Println(strings.EqualFold("Go", "go"))
	fmt.Println(strings.EqualFold("Go2", "go"))

	fmt.Println("========================================")
	// HasPrefix 测试字符串 s 是否以前缀开头。
	fmt.Println(strings.HasPrefix("Gopher", "Go"))
	fmt.Println(strings.HasPrefix("Gopher", "C"))
	fmt.Println(strings.HasPrefix("Gopher", ""))
	fmt.Println(strings.HasSuffix("Amigo", "go"))
	fmt.Println(strings.HasSuffix("Amigo", "O"))
	fmt.Println(strings.HasSuffix("Amigo", "Ami"))
	fmt.Println(strings.HasSuffix("Amigo", ""))

	fmt.Println("========================================")
	//  索引返回 s 中第一个 substr 实例的索引，如果 substr 不存在于 s 中，则返回-1。
	fmt.Println(strings.Index("chicken", "ken"))
	fmt.Println(strings.Index("chicken", "dmr"))
	fmt.Println(strings.Index("中文知乎", "文")) //3
	// IndexAny 返回 s 中任何 Unicode 代码点的第一个实例的索引，如果没有来自 chars 的 Unicode 代码点，则返回-1。
	fmt.Println(strings.IndexAny("chicken", "aeiouy"))
	fmt.Println(strings.IndexAny("crwth", "aeiouy"))
	// IndexByte 返回 s 的第一个实例的索引，如果 c 不存在于 s 中，则返回-1。
	fmt.Println(strings.IndexByte("golang", 'g'))
	fmt.Println(strings.IndexByte("gophers", 'h'))
	fmt.Println(strings.IndexByte("golang", 'x'))

	fmt.Println(strings.IndexByte("332", '2'))

	//IndexFunc 将索引返回到满足 f(c) 的第一个
	// Unicode 代码点的 s 中，否则返回-1。
	fmt.Println("========================================")
	f := func(c rune) bool {
		return unicode.Is(unicode.Han, c)
	}
	fmt.Println(strings.IndexFunc("Hello, 世界", f))
	fmt.Println(strings.IndexFunc("Hello, world", f))

	fmt.Println("========================================")

	//IndexRune 返回 Unicode 代码点 r 的第一个实例的索引，如果符号不存在于 s 中，
	//则返回-1。如果 r 是 utf8.RuneError ，它将返回任何无效的 UTF-8 字节序列的第一个实例。

	fmt.Println(strings.IndexRune("chicken", 'k'))
	fmt.Println(strings.IndexRune("chicken", 'd'))
	fmt.Println(strings.IndexRune("中文", '文')) //3

	fmt.Println("========================================")
	//Join 连接 a 的元素以创建单个字符串。分隔符字符串 sep 放置在结果字符串中的元素之间。
	s := []string{"foo", "bar", "baz"}
	fmt.Println(strings.Join(s, ", "))

	fmt.Println("========================================")
	//LastIndex 返回 s 中最后一个 substr 实例的索引，如果 substr 不存在于 s 中，则返回-1。
	fmt.Println(strings.Index("go gopher", "go"))
	fmt.Println(strings.LastIndex("go gopher", "go"))
	fmt.Println(strings.LastIndex("go gopher", "rodent"))

	fmt.Println("========================================")
	//Map 根据映射函数返回字符串 s 的一个副本，并修改其所有字符。
	//如果映射返回负值，则字符将从字符串中删除而不会被替换。
	rot13 := func(r rune) rune {
		switch {
		case r >= 'A' && r <= 'Z':
			return 'A' + (r-'A'+13)%26
		case r >= 'a' && r <= 'z':
			return 'a' + (r-'a'+13)%26
		}
		return r
	}
	fmt.Println(strings.Map(rot13, "'Twas brillig and the slithy gopher..."))

	// Repeat 返回一个由字符串 s 的计数副本组成的新字符串。
	fmt.Println("========================================")
	fmt.Println("ba" + strings.Repeat("na", 2))

	fmt.Println("========================================")
	//Replace 返回字符串s的一个副本，其中前 n
	// 个不重叠的旧实例由 new 替换。如果 old 为空，则它在字符串的开始处和每个 UTF-8 序列之后进行匹配，
	//最多生成一个 k-1 字符串的 k+1 替换。如果 n <0，则替换次数没有限制。
	fmt.Println(strings.Replace("oink oink oink", "k", "ky", 2))
	fmt.Println(strings.Replace("oink oink oink", "oink", "moo", -1))
	// 将切片分割成由 sep 分隔的所有子字符串，并在这些分隔符之间返回一个子切片片段。
	fmt.Printf("%q\n", strings.Split("a,b,c", ","))
	fmt.Printf("%q\n", strings.Split("a man a plan a canal panama", "a "))
	fmt.Printf("%q\n", strings.Split(" xyz ", ""))
	fmt.Printf("%q\n", strings.Split("", "Bernardo O'Higgins"))

	fmt.Printf("%q\n", strings.SplitAfter("a,b,c", ",")) //["a," "b," "c"]

	fmt.Printf("%q\n", strings.SplitAfterN("a,b,c", ",", 2)) //["a," "b,c"]

	fmt.Printf("%q\n", strings.SplitN("a,b,c", ",", 2)) //["a" "b,c"]
	z := strings.SplitN("a,b,c", ",", 0)
	fmt.Printf("%q (nil = %v)\n", z, z == nil)

	fmt.Println("========================================")
	// 标题返回字符串 s 的一个副本，其中所有的 Unicode 字母开始将单词映射到其标题大小写。
	//规则标题用于单词边界的规则不能正确处理 Unicode 标点符号
	fmt.Println(strings.Title("her royal highness")) //Her Royal Highness
	fmt.Println(strings.ToTitle("loud noises"))      //LOUD NOISES
	fmt.Println(strings.ToTitle("хлеб"))             // ХЛЕБ

	// Trim 将返回字符串 s 的一部分，并将 cutset 中包含的所有前导和尾部 Unicode 代码点删除。
	fmt.Println("========================================")

	fmt.Printf("[%q]", strings.Trim(" !!! Achtung! Achtung! !!! ", "! ")) //["Achtung! Achtung"]

	trimFunc := func(c rune) bool {
		return !unicode.IsLetter(c) && !unicode.IsNumber(c)
	}

	fmt.Printf("[%q]", strings.TrimFunc("  Achtung1! Achtung2,...", trimFunc)) //["Achtung1! Achtung2"]

	//runc

}
